package com.example.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/*
@description:实现限流功能
@ClassName CurrentLimitController
@author chen
@create 2025-06-18 17:30
@Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/currentLimit")
public class CurrentLimitController
{

    /*
        使用juc当中提供的信号量实现限流功能 内部提供了获取令牌,和还令牌的一些方法
     */
    private Semaphore semaphore = new Semaphore(50);

    @GetMapping("/placeOrder")
    public String placeOrder() throws InterruptedException
    {
        boolean flag = semaphore.tryAcquire(
                1, // 表示尝试去获取一个信号量
                1L, // 最多等待的时间
                TimeUnit.SECONDS// 最多等待的时间单位
        );
        if(flag)
        {
            try
            {
                // 这里休眠2秒，模拟下单的操作
                TimeUnit.SECONDS.sleep(2);
                return "下单成功";
            }
            finally
            {
                // 这里一定不要漏掉了，令牌用完了，要还回去
                semaphore.release();
            }
        }else
        {
            log.info("获取令牌失败");
            return "系统繁忙，请稍后重试";
        }
    }


}
